package notes.java.juc.demo;

import java.util.concurrent.CountDownLatch;

/**
 * 测试闭锁
 * 处理计算中，其它线程处理等待状态，直到处理完，其它线程才进行操作。
 * 
 * 每次只有一个线程执行，直到完成后其它线程才处理。否则处于等待中。
 * 
 * 通常情况下，是没法在主线程中计算10个线程完成的总时间的。
 */
public class J5_TestCountDownLatch {
	
	public static void main(String[] args) throws InterruptedException {
		long start = System.currentTimeMillis();
		System.out.println("-----------start-----------");
		// 10个闭锁
		CountDownLatch latch = new CountDownLatch(10);
		CDLatch cdlatch = new CDLatch(latch);
		
		for(int i=0; i<10; i++) {
			new Thread(cdlatch).start();
		}
		// 等待中
		latch.await();
		
		long end = System.currentTimeMillis();
		System.out.println("used:" + (end-start));
	}

}

class CDLatch implements Runnable {

	private CountDownLatch latch;
	
	public CDLatch (CountDownLatch latch) {
		this.latch = latch;
	}
	
	@Override
	public void run() {
		synchronized (latch) {
			try {
				for (int i = 0; i < 100; i++) {
					if (i % 2 == 0) {
						System.out.println(Thread.currentThread().getName() + " : " + i);
					}
				} 
			} finally {
				latch.countDown(); // 减1
			}
		}
	}
	
}
